Socket API হলো নেটওয়ার্ক প্রোগ্রামিংয়ের একটি সেট অফ ফাংশন এবং টুল, যা ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ স্থাপন, ডেটা পাঠানো এবং গ্রহণ করার জন্য ব্যবহৃত হয়। Socket API সাধারণত TCP/IP প্রোটোকল স্ট্যাকের ওপর ভিত্তি করে কাজ করে এবং এটি Unix, Linux, Windows সহ বিভিন্ন অপারেটিং সিস্টেমে উপলব্ধ। এটি নেটওয়ার্ক ভিত্তিক অ্যাপ্লিকেশন তৈরির জন্য ডেভেলপারদের প্রয়োজনীয় ফাংশন এবং ইন্টারফেস প্রদান করে।
Socket API হলো এমন একটি ইন্টারফেস যা ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ স্থাপন এবং ডেটা ট্রান্সফার করার জন্য Socket তৈরি এবং পরিচালনা করতে ব্যবহৃত হয়। এটি নেটওয়ার্ক প্রোগ্রামিংয়ের ভিত্তি হিসেবে কাজ করে এবং বিভিন্ন প্রোগ্রামিং ভাষায় (যেমন C, Python, Java) ব্যবহার করা যায়। Socket API TCP এবং UDP প্রোটোকলের সাথে কাজ করতে সক্ষম এবং এটি বিভিন্ন স্তরে যোগাযোগ নিশ্চিত করতে ব্যবহৃত হয়।
Socket API-তে কিছু প্রধান ফাংশন রয়েছে, যা ক্লায়েন্ট এবং সার্ভারের মধ্যে সংযোগ এবং ডেটা ট্রান্সফার পরিচালনা করতে ব্যবহৃত হয়। নিচে Socket API-এর কিছু গুরুত্বপূর্ণ ফাংশন ও তাদের ব্যবহার উল্লেখ করা হলো:
socket():
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
এখানে AF_INET
IPv4 ঠিকানার জন্য, SOCK_STREAM
TCP-এর জন্য, এবং 0
প্রোটোকল ডিফল্ট হিসেবে ব্যবহার করা হয়েছে।
bind():
bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
এখানে sockfd
হলো Socket, server_addr
হলো সার্ভারের IP Address এবং Port-এর তথ্য ধারণকারী স্ট্রাকচার।
listen():
listen()
ফাংশন ব্যবহার করা হয়।উদাহরণ:
listen(sockfd, 5);
এখানে 5
হলো ব্যাকলগ (backlog), যা সর্বোচ্চ কতটি কানেকশন একসঙ্গে অপেক্ষায় থাকতে পারবে তা নির্দেশ করে।
accept():
accept()
ফাংশন ব্যবহার করা হয়। এটি একটি নতুন Socket তৈরি করে, যা সার্ভার এবং ক্লায়েন্টের মধ্যে ডেটা ট্রান্সফারের জন্য ব্যবহৃত হয়।উদাহরণ
int new_sockfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_len);
এখানে new_sockfd
হলো ক্লায়েন্টের সাথে সংযোগ স্থাপনকারী নতুন Socket, client_addr
হলো ক্লায়েন্টের ঠিকানা এবং client_len
হলো এর আকার।
connect():
connect()
ফাংশন ব্যবহার করা হয়। এটি সার্ভারের IP Address এবং Port Number ব্যবহার করে সংযোগ স্থাপন করে।উদাহরণ
connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
এখানে sockfd
হলো ক্লায়েন্টের Socket এবং server_addr
হলো সার্ভারের ঠিকানা।
send() এবং recv():
send()
এবং recv()
ফাংশনের মাধ্যমে ডেটা পাঠাতে এবং গ্রহণ করতে পারে।উদাহরণ:
send(sockfd, "Hello, Server!", strlen("Hello, Server!"), 0);
recv(sockfd, buffer, sizeof(buffer), 0);
এখানে ক্লায়েন্ট send()
ফাংশনের মাধ্যমে সার্ভারে বার্তা পাঠাচ্ছে এবং recv()
ফাংশনের মাধ্যমে সার্ভার থেকে বার্তা গ্রহণ করছে।
close():
close()
ফাংশন ব্যবহার করা হয়, যা সংযোগ সম্পন্ন হলে ক্লায়েন্ট এবং সার্ভার উভয়েই ব্যবহার করতে পারে।উদাহরণ:
close(sockfd);
Socket API সাধারণত TCP এবং UDP প্রোটোকল ব্যবহার করে ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ স্থাপন করতে ব্যবহৃত হয়। নিচে TCP ভিত্তিক ক্লায়েন্ট এবং সার্ভার অ্যাপ্লিকেশন তৈরির একটি সাধারণ উদাহরণ দেওয়া হলো:
TCP সার্ভার প্রোগ্রাম
int sockfd, new_sock;
struct sockaddr_in server_addr, client_addr;
socklen_t addr_size;
char buffer[1024];
// Socket তৈরি
sockfd = socket(AF_INET, SOCK_STREAM, 0);
// সার্ভার ঠিকানা সেটআপ
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = INADDR_ANY;
// Binding
bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
// Listening
listen(sockfd, 5);
// Accepting Connection
addr_size = sizeof(client_addr);
new_sock = accept(sockfd, (struct sockaddr*)&client_addr, &addr_size);
// ডেটা পাঠানো এবং গ্রহণ
recv(new_sock, buffer, 1024, 0);
send(new_sock, "Hello, Client!", strlen("Hello, Client!"), 0);
// Socket বন্ধ করা
close(new_sock);
close(sockfd);
TCP ক্লায়েন্ট প্রোগ্রাম
int sockfd;
struct sockaddr_in server_addr;
char buffer[1024];
// Socket তৈরি
sockfd = socket(AF_INET, SOCK_STREAM, 0);
// সার্ভার ঠিকানা সেটআপ
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
// সার্ভারের সাথে সংযোগ স্থাপন
connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
// ডেটা পাঠানো এবং গ্রহণ
send(sockfd, "Hello, Server!", strlen("Hello, Server!"), 0);
recv(sockfd, buffer, 1024, 0);
// Socket বন্ধ করা
close(sockfd);
Socket API এর ভূমিকা এবং প্রয়োজনীয়তা
Socket API হলো নেটওয়ার্ক প্রোগ্রামিংয়ের একটি মৌলিক ইন্টারফেস, যা ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা আদান-প্রদান এবং যোগাযোগ স্থাপন করতে ব্যবহৃত হয়। এটি ক্লায়েন্ট-সার্ভার ভিত্তিক নেটওয়ার্ক অ্যাপ্লিকেশন এবং পরিষেবা তৈরি এবং পরিচালনার জন্য অপরিহার্য। Socket API বিভিন্ন প্রোগ্রামিং ভাষায় ব্যবহৃত হয় (যেমন C, Python, Java) এবং TCP/IP প্রোটোকল স্ট্যাকের মাধ্যমে কাজ করে।
ক্লায়েন্ট-সার্ভার মডেল তৈরি করা:
নেটওয়ার্ক সংযোগ স্থাপন করা:
ডেটা ট্রান্সফার পরিচালনা করা:
send()
এবং recv()
। এটি ক্লায়েন্ট এবং সার্ভারের মধ্যে সঠিকভাবে ডেটা ট্রান্সফার নিশ্চিত করতে সাহায্য করে।কানেকশন ম্যানেজমেন্ট:
accept()
), সংযোগের জন্য অপেক্ষা করতে (listen()
), এবং ক্লায়েন্টের সাথে সংযোগ স্থাপন করতে (connect()
) সহায়ক হয়।আন্তঃপ্রসেস যোগাযোগ (IPC) প্রদান করা:
নেটওয়ার্ক অ্যাপ্লিকেশন ডেভেলপমেন্ট:
রিয়েল-টাইম কমিউনিকেশন:
কাস্টম প্রোটোকল এবং সার্ভিস তৈরি:
ইন্টার-প্রসেস কমিউনিকেশন (IPC):
নেটওয়ার্কিং এবং সিকিউরিটি টুলস:
Socket API ব্যবহার করে একটি সাধারণ TCP ক্লায়েন্ট-সার্ভার মডেল তৈরি করা যায়। নিচে একটি উদাহরণ হিসেবে TCP সার্ভার এবং ক্লায়েন্টের মধ্যে যোগাযোগের একটি প্রক্রিয়া দেখানো হলো:
TCP সার্ভার উদাহরণ
int sockfd, new_sock;
struct sockaddr_in server_addr, client_addr;
socklen_t addr_size;
char buffer[1024];
// Socket তৈরি করা
sockfd = socket(AF_INET, SOCK_STREAM, 0);
// সার্ভার ঠিকানা সেটআপ করা
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = INADDR_ANY;
// Binding
bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
// Listening
listen(sockfd, 5);
// Accepting Connection
addr_size = sizeof(client_addr);
new_sock = accept(sockfd, (struct sockaddr*)&client_addr, &addr_size);
// ডেটা পাঠানো এবং গ্রহণ
recv(new_sock, buffer, 1024, 0);
send(new_sock, "Hello, Client!", strlen("Hello, Client!"), 0);
// Socket বন্ধ করা
close(new_sock);
close(sockfd);
TCP ক্লায়েন্ট উদাহরণ
int sockfd;
struct sockaddr_in server_addr;
char buffer[1024];
// Socket তৈরি করা
sockfd = socket(AF_INET, SOCK_STREAM, 0);
// সার্ভার ঠিকানা সেটআপ করা
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
// সার্ভারের সাথে সংযোগ স্থাপন করা
connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
// ডেটা পাঠানো এবং গ্রহণ
send(sockfd, "Hello, Server!", strlen("Hello, Server!"), 0);
recv(sockfd, buffer, 1024, 0);
// Socket বন্ধ করা
close(sockfd);
Socket Programming-এ Socket System Calls হলো মূল ফাংশন বা মেথড, যা ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ স্থাপন, ডেটা আদান-প্রদান, এবং সংযোগ বন্ধ করতে ব্যবহৃত হয়। নিচে প্রতিটি System Call-এর বিস্তারিত ব্যাখ্যা এবং তাদের ব্যবহার উল্লেখ করা হলো:
কাজ:
socket()
System Call একটি নতুন Socket তৈরি করে, যা ক্লায়েন্ট বা সার্ভারের মাধ্যমে নেটওয়ার্ক যোগাযোগের জন্য ব্যবহৃত হয়। এটি IP Address Family, Socket Type, এবং প্রোটোকল নির্ধারণ করে।সিনট্যাক্স:
int socket(int domain, int type, int protocol);
AF_INET
IPv4 এর জন্য, AF_INET6
IPv6 এর জন্য)।SOCK_STREAM
TCP এর জন্য, SOCK_DGRAM
UDP এর জন্য)।0
রাখা হয়, যা ডিফল্ট প্রোটোকল নির্ধারণ করে।উদাহরণ:
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
কাজ:
bind()
System Call একটি Socket-কে নির্দিষ্ট IP Address এবং Port Number-এর সাথে সংযুক্ত করে। এটি সাধারণত সার্ভারের ক্ষেত্রে ব্যবহৃত হয়।সিনট্যাক্স:
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
socket()
System Call থেকে ফেরত আসে।addr
স্ট্রাকচারের আকার নির্দেশ করে।উদাহরণ:
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = INADDR_ANY;
bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
কাজ:
listen()
System Call সার্ভার Socket-কে ইনকামিং সংযোগের জন্য প্রস্তুত করে। এটি এক বা একাধিক ক্লায়েন্ট সংযোগ গ্রহণের জন্য সার্ভারকে অপেক্ষমাণ অবস্থায় রাখে।সিনট্যাক্স:
int listen(int sockfd, int backlog);
bind()
System Call থেকে সংযুক্ত করা হয়েছে।উদাহরণ:
listen(sockfd, 5);
কাজ:
accept()
System Call ইনকামিং সংযোগ গ্রহণ করে এবং ক্লায়েন্টের সাথে একটি নতুন Socket তৈরি করে, যা ডেটা ট্রান্সফার করার জন্য ব্যবহৃত হয়।সিনট্যাক্স:
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
sockfd: Socket file descriptor, যা ইনকামিং সংযোগের জন্য অপেক্ষা করছে।
উদাহরণ:
struct sockaddr_in client_addr;
socklen_t addr_size = sizeof(client_addr);
int new_sockfd = accept(sockfd, (struct sockaddr*)&client_addr, &addr_size);
কাজ:
connect()
System Call ক্লায়েন্ট Socket-কে সার্ভারের সাথে সংযোগ স্থাপন করতে ব্যবহৃত হয়। এটি সার্ভারের IP Address এবং Port Number ব্যবহার করে সংযোগ স্থাপন করে।সিনট্যাক্স:
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
উদাহরণ:
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
কাজ:
send()
System Call ডেটা পাঠানোর জন্য ব্যবহৃত হয়। এটি TCP সংযোগে ডেটা ট্রান্সমিট করার জন্য Socket ব্যবহার করে।সিনট্যাক্স:
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
0
)।উদাহরণ:
char *message = "Hello, Server!";
send(sockfd, message, strlen(message), 0);
কাজ:
recv()
System Call ডেটা গ্রহণের জন্য ব্যবহৃত হয়। এটি TCP সংযোগে ইনকামিং ডেটা প্যাকেট গ্রহণ করতে Socket ব্যবহার করে।সিনট্যাক্স:
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
0
)।উদাহরণ:
char buffer[1024];
recv(sockfd, buffer, sizeof(buffer), 0);
কাজ:
close()
System Call একটি Socket বন্ধ করতে ব্যবহৃত হয়। এটি সংযোগ বন্ধ করার এবং Socket রিসোর্স মুক্ত করার জন্য ব্যবহার করা হয়।সিনট্যাক্স:
int close(int sockfd);
উদাহরণ:
close(sockfd);
socket()
→ bind()
→ listen()
→ accept()
→ recv()
/send()
→ close()
socket()
→ connect()
→ send()
/recv()
→ close()
Socket Programming-এ Socket Creation এবং Initialization হলো ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ স্থাপনের প্রথম ধাপ। এই ধাপে Socket তৈরি এবং সেটআপ করা হয়, যাতে এটি সঠিকভাবে নেটওয়ার্ক সংযোগ স্থাপন এবং ডেটা আদান-প্রদানে সক্ষম হয়। এই প্রক্রিয়ার মাধ্যমে, একটি Socket একটি নির্দিষ্ট IP Address Family, Socket Type, এবং প্রোটোকল নির্ধারণ করে তৈরি করা হয়।
Socket তৈরি করতে socket()
System Call ব্যবহার করা হয়। এটি Socket-এর জন্য একটি ফাইল ডেসক্রিপ্টর (file descriptor) তৈরি করে এবং তা ক্লায়েন্ট বা সার্ভারের মাধ্যমে নেটওয়ার্ক যোগাযোগের জন্য ব্যবহৃত হয়।
Syntax:
int socket(int domain, int type, int protocol);
domain: Address family নির্দেশ করে, যা Socket-এর মাধ্যমে কোন প্রোটোকল ব্যবহার করা হবে তা নির্ধারণ করে। সাধারণত ব্যবহৃত ডোমেইনগুলো হলো:
AF_INET
(IPv4) - IPv4 ঠিকানা ব্যবহারের জন্য।AF_INET6
(IPv6) - IPv6 ঠিকানা ব্যবহারের জন্য।AF_UNIX
(Unix Domain Sockets) - একই সিস্টেমে প্রসেসগুলোর মধ্যে যোগাযোগের জন্য।type: Socket-এর ধরন নির্দেশ করে, যা সংযোগের পদ্ধতি নির্ধারণ করে। সাধারণত ব্যবহৃত টাইপগুলো হলো:
SOCK_STREAM
(TCP) - কানেকশন-অরিয়েন্টেড এবং নির্ভরযোগ্য যোগাযোগের জন্য।SOCK_DGRAM
(UDP) - কানেকশনলেস এবং দ্রুত যোগাযোগের জন্য।protocol: সাধারণত 0
রাখা হয়, যা ডিফল্ট প্রোটোকল ব্যবহার করে। এটি নির্দিষ্ট প্রোটোকল যেমন TCP বা UDP এর সাথে সংশ্লিষ্ট হয়।
উদাহরণ:
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
AF_INET
IPv4 ঠিকানার জন্য, SOCK_STREAM
TCP প্রোটোকলের জন্য, এবং 0
ডিফল্ট প্রোটোকল নির্ধারণ করার জন্য ব্যবহৃত হয়েছে।-1
রিটার্ন করে, যা ত্রুটির নির্দেশ দেয়।Socket Creation-এর পর, Socket Initialization প্রক্রিয়ায় Socket-এর জন্য Address এবং Port Number সেটআপ করা হয়। সার্ভারের ক্ষেত্রে, bind()
System Call ব্যবহার করে IP Address এবং Port Number সেট করা হয়, যাতে এটি নির্দিষ্ট পোর্টে সংযোগ গ্রহণ করতে পারে। ক্লায়েন্টের ক্ষেত্রে, connect()
System Call ব্যবহার করে ক্লায়েন্ট Socket-কে সার্ভারের সাথে সংযুক্ত করা হয়।
সার্ভারের ক্ষেত্রে, Socket Initialization-এর জন্য bind()
এবং listen()
ফাংশন ব্যবহার করা হয়।
bind():
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = INADDR_ANY;
bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
server_addr
হলো sockaddr_in
স্ট্রাকচার, যা সার্ভারের ঠিকানা এবং পোর্ট ধারণ করে।htons()
ফাংশন পোর্ট নম্বরকে নেটওয়ার্ক অর্ডারে (network byte order) কনভার্ট করে।listen():
int listen(int sockfd, int backlog);
listen(sockfd, 5);
backlog
হলো সর্বোচ্চ কতটি কানেকশন একসঙ্গে অপেক্ষায় থাকতে পারবে, তা নির্দেশ করে।ক্লায়েন্টের ক্ষেত্রে, connect()
ফাংশন ব্যবহার করা হয়, যা সার্ভারের IP Address এবং Port Number ব্যবহার করে সংযোগ স্থাপন করে।
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
inet_addr()
ফাংশন ব্যবহার করে IPv4 ঠিকানাকে নেটওয়ার্ক ফরম্যাটে কনভার্ট করা হয়েছে।server_addr
স্ট্রাকচার সার্ভারের IP Address এবং Port ধারণ করছে।নিচে TCP ভিত্তিক ক্লায়েন্ট এবং সার্ভারের মধ্যে সংযোগ স্থাপনের একটি সাধারণ উদাহরণ দেখানো হলো:
int sockfd, new_sock;
struct sockaddr_in server_addr, client_addr;
socklen_t addr_size;
char buffer[1024];
// Socket তৈরি
sockfd = socket(AF_INET, SOCK_STREAM, 0);
// সার্ভার ঠিকানা সেটআপ
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = INADDR_ANY;
// Binding
bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
// Listening
listen(sockfd, 5);
// Accepting Connection
addr_size = sizeof(client_addr);
new_sock = accept(sockfd, (struct sockaddr*)&client_addr, &addr_size);
// ডেটা পাঠানো এবং গ্রহণ
recv(new_sock, buffer, 1024, 0);
send(new_sock, "Hello, Client!", strlen("Hello, Client!"), 0);
// Socket বন্ধ
close(new_sock);
close(sockfd);
int sockfd;
struct sockaddr_in server_addr;
char buffer[1024];
// Socket তৈরি
sockfd = socket(AF_INET, SOCK_STREAM, 0);
// সার্ভার ঠিকানা সেটআপ
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
// সার্ভারের সাথে সংযোগ স্থাপন
connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
// ডেটা পাঠানো এবং গ্রহণ
send(sockfd, "Hello, Server!", strlen("Hello, Server!"), 0);
recv(sockfd, buffer, 1024, 0);
// Socket বন্ধ
close(sockfd);
Socket Programming-এ ক্লায়েন্ট এবং সার্ভার উভয়কেই Socket ব্যবহার করে নেটওয়ার্কে যোগাযোগ স্থাপন করতে হয়। নিচে TCP (Transmission Control Protocol) ব্যবহার করে একটি সাধারণ ক্লায়েন্ট-সার্ভার অ্যাপ্লিকেশন উদাহরণ দেখানো হয়েছে, যেখানে সার্ভার একটি নির্দিষ্ট পোর্টে সংযোগ গ্রহণ করে এবং ক্লায়েন্ট সেই সার্ভারের সাথে সংযোগ স্থাপন করে ডেটা আদান-প্রদান করে।
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
char buffer[1024] = {0};
char *hello = "Hello from server";
// 1. Socket তৈরি করা
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// 2. সার্ভার ঠিকানা সেটআপ করা
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
// 3. Binding করা
if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) < 0) {
perror("Bind failed");
exit(EXIT_FAILURE);
}
// 4. Listening করা
if (listen(server_fd, 3) < 0) {
perror("Listen failed");
exit(EXIT_FAILURE);
}
printf("Server is listening on port %d\n", PORT);
// 5. Accepting সংযোগ
if ((new_socket = accept(server_fd, (struct sockaddr*)&address, (socklen_t*)&addrlen)) < 0) {
perror("Accept failed");
exit(EXIT_FAILURE);
}
// 6. ডেটা গ্রহণ করা
read(new_socket, buffer, 1024);
printf("Client: %s\n", buffer);
// 7. ডেটা পাঠানো
send(new_socket, hello, strlen(hello), 0);
printf("Hello message sent to client\n");
// 8. Socket বন্ধ করা
close(new_socket);
close(server_fd);
return 0;
}
TCP ক্লায়েন্ট প্রোগ্রাম উদাহরণ (C ভাষায়)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
int sock = 0;
struct sockaddr_in serv_addr;
char *hello = "Hello from client";
char buffer[1024] = {0};
// 1. Socket তৈরি করা
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("Socket creation failed\n");
return -1;
}
// 2. সার্ভার ঠিকানা সেটআপ করা
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
// 3. IP Address সেট করা
if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
printf("Invalid address or Address not supported\n");
return -1;
}
// 4. সার্ভারের সাথে সংযোগ স্থাপন করা
if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {
printf("Connection Failed\n");
return -1;
}
// 5. ডেটা পাঠানো
send(sock, hello, strlen(hello), 0);
printf("Hello message sent to server\n");
// 6. ডেটা গ্রহণ করা
read(sock, buffer, 1024);
printf("Server: %s\n", buffer);
// 7. Socket বন্ধ করা
close(sock);
return 0;
}
Socket তৈরি:
socket()
System Call ব্যবহার করে সার্ভার Socket তৈরি করা হয়, যা AF_INET
(IPv4) এবং SOCK_STREAM
(TCP) ব্যবহার করে।Binding:
bind()
ফাংশন সার্ভার Socket-কে একটি নির্দিষ্ট IP Address এবং Port Number (8080
) এর সাথে সংযুক্ত করে, যাতে এটি ইনকামিং সংযোগ গ্রহণ করতে পারে।Listening:
listen()
ফাংশন সার্ভার Socket-কে ইনকামিং সংযোগ গ্রহণের জন্য অপেক্ষা করতে প্রস্তুত করে। এখানে 3
প্যারামিটারটি ব্যাকলগ নির্দেশ করে, যা সার্ভার কতটি ইনকামিং সংযোগ কিউতে রাখতে পারবে।Accepting সংযোগ:
accept()
ফাংশন ব্যবহার করে ইনকামিং সংযোগ গ্রহণ করা হয় এবং একটি নতুন Socket তৈরি করা হয়, যা ক্লায়েন্টের সাথে ডেটা ট্রান্সফারের জন্য ব্যবহৃত হয়।ডেটা পাঠানো এবং গ্রহণ:
read()
এবং send()
ফাংশন ব্যবহার করে ক্লায়েন্ট থেকে ডেটা গ্রহণ এবং ক্লায়েন্টে ডেটা পাঠানো হয়।Socket বন্ধ করা:
close()
ফাংশন ব্যবহার করে সার্ভার এবং ক্লায়েন্ট Socket বন্ধ করা হয়।Socket তৈরি:
socket()
System Call ব্যবহার করে ক্লায়েন্ট Socket তৈরি করা হয়।সার্ভারের ঠিকানা সেটআপ:
inet_pton()
ফাংশন ব্যবহার করে সার্ভারের IP Address (127.0.0.1
, যা localhost) এবং Port Number (8080
) সেট করা হয়।সার্ভারের সাথে সংযোগ স্থাপন:
connect()
ফাংশন ব্যবহার করে সার্ভারের সাথে সংযোগ স্থাপন করা হয়।ডেটা পাঠানো এবং গ্রহণ:
send()
এবং read()
ফাংশন ব্যবহার করে ক্লায়েন্ট ডেটা পাঠায় এবং সার্ভার থেকে ডেটা গ্রহণ করে।Socket বন্ধ করা:
close()
ফাংশন ব্যবহার করে ক্লায়েন্ট Socket বন্ধ করা হয়।common.read_more